package com.mrx.spring.security.service;

import com.mrx.spring.security.exception.UserNotFoundException;
import com.mrx.spring.security.model.SecurityUser;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import org.springframework.util.AntPathMatcher;

import java.util.Set;

/**
 * 安全服务, 引入了 security 包必须定义一个 {@link ISecurityService}
 *
 * @author Mr.X
 * @since 2023-10-16 14:52
 **/
public interface ISecurityService {

    /**
     * 使用 token 查找对应的用户信息
     *
     * @param token token, 可能为 null
     * @return token 关联的用户信息, 不能为 null, 找不到就抛出异常 {@link UserNotFoundException}
     */
    @NonNull
    SecurityUser loadUserByToken(@Nullable String token);

    /**
     * 获取 token 的 header-key
     *
     * @return token key
     */
    @NonNull
    String tokenHeader();

    /**
     * 不需要校验 token 的 url
     *
     * @return 不需要校验 token 的 url, 可以是正则表达式, 最后将会使用 {@link AntPathMatcher} 匹配, 不能为 null
     */
    @NonNull
    Set<String> permitUrls();

    /**
     * 是否启用 api 权限校验
     */
    default boolean enableApiPermission() {
        return false;
    }

}
